﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.Serialization;

namespace G.Model
{
    [CollectionDataContract]
    public class GameValueDefs : KeyedCollection<string, GameValueDef>
    {
        private GameSpaceDef _GameDef;
        
        internal GameValueDefs()
        { }
        
        internal GameValueDefs(GameSpaceDef pGameDef)
        {
            _GameDef = pGameDef;
        }

        public GameValueDefs(GameValueDefs copy)
        {
            foreach (GameValueDef def in copy)
            {
                Add(def.Copy());
            }
        }

        public GameSpaceDef GameDef
        {
            get { return _GameDef; }
            set 
            { 
                _GameDef = value; 
                foreach (GameValueDef def in this) {
                    def.GameDef = value;
                }
            }
        }
        
        public new bool Remove(GameValueDef item)
        {
            bool b = base.Remove(item);
            if (item.GameDef != null)
            {
                item.GameDef.IsDirty = true;
            }
            return b;
        }
        
        protected override void RemoveItem(int index)
        {
            GameValueDef def = base[index];
            base.RemoveItem(index);
            if (def.GameDef != null)
            {
                def.GameDef.IsDirty = true;
            }
        }
        
        public GameValueDef Add(string pName, TypeCode pCode = TypeCode.String)
        {
            GameValueDef def = new GameValueDef(pName, pCode);
            base.Add(def);
            return def;
        }

        protected override void InsertItem(int index, GameValueDef item)
        {
            item.GameDef = _GameDef;
            
            string key = GetKeyForItem(item);
            for (int i = 0; i < 100; i++)
            {
                if (base.Contains(item))
                {
                    item.Name = key + i;
                    continue;
                }

                break;
            }

            if (_GameDef != null)
            {
                _GameDef.IsDirty = true;
            }
            base.InsertItem(index, item);
        }

        protected override string GetKeyForItem(GameValueDef item)
        {
            return item.Name;
        }
        
//        public int Count
//        {
//            get { return _Collection.Count; }
//        }
//        
//        public bool IsReadOnly
//        {
//            get { return false; }
//        }
//        
//        public GameValueDef Add(string pName, TypeCode pCode = TypeCode.String)
//        {
//            GameValueDef def = new GameValueDef(pName, pCode);
//            Add(def);
//            return def;
//        }
//        
//        public void Add(GameValueDef item)
//        {
//            for (int i = 0; i < 100; i++)
//            {
//                if (_Collection.ContainsKey(item.Name))
//                {
//                    item.Name = item.Name + i;
//                    continue;
//                }
//
//                break;
//            }
//
//            item.GameDef = _GameDef;
//            if (_GameDef != null)
//            {
//                _GameDef.IsDirty = true;
//            }
//            _Collection.Add(item.Name, item);
//        }
//        
//        public void Clear()
//        {
//            _Collection.Clear();
//            _GameDef.IsDirty = true;
//        }
//        
//        public bool Contains(GameValueDef item)
//        {
//            return _Collection.ContainsKey(item.Name);
//        }
//        
//        public bool Contains(string key)
//        {
//            return _Collection.ContainsKey(key);
//        }
//        
//        public void CopyTo(GameValueDef[] array, int arrayIndex)
//        {
//            _Collection.Values.CopyTo(array, arrayIndex);
//        }
//        
//        public bool Remove(GameValueDef item) 
//        {
//            bool b = _Collection.Remove(item.Name);
//            _GameDef.IsDirty = true;
//            return b;
//        }
//        
//        public IEnumerator<GameValueDef> GetEnumerator()
//        {
//            return _Collection.Values.GetEnumerator();
//        }
//        
//        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
//        {
//            return _Collection.Values.GetEnumerator();
//        }
//        
//        public GameValueDef this[string key]
//        {
//            get
//            {
//                return _Collection[key];
//            }
//            set
//            {
//                _Collection[key] = value;
//                _GameDef.IsDirty = true;
//            }
//        }
        
    }
}
